package tech.aistar.corejava.day09.inner;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:
 * @date 2019/7/25 0025
 */
public class Outer {//外部类
    //普通属性
    public int id = 10;

    public int x = 900;

    public static int sid = 200;

    //1. 成员内部类
    //将内部类作为外部类的成员存在着
    public class MemberClass{
        public int id = 100;

        //成员内部类中不能去定义静态成员
        //public static int sids = 300;

        public void test01(){
            System.out.println("test01...");
            System.out.println("内部类的id:"+id);//100

            //当内部类的属性名和外部类的属性名同名的时候 - 外部类.this.属性
            System.out.println("外部类的id:"+Outer.this.id);

            //仅仅只有外部类存在属性为x
            System.out.println("外部类的仅有的x:"+x);

            System.out.println("外部类的静态的sid:"+sid);
            System.out.println("外部类的静态的sid:"+Outer.sid);
        }
    }

    //自创...
    public MemberClass createMemberClass(){
        return new MemberClass();
    }

    //静态内部类 - 可以上升成为"顶级类".
    //把内部类看作是外部类的"静态成员"
    public static class StaticClass{
        public int id = 100;

        public static int sid = 800;

        public void test02(){
            System.out.println("test02");

            System.out.println("内部类id:"+id);

            //静态内部类的内部是不允许访问外部类的非静态的成员.
           // System.out.println("外部类的id:"+Outer.this.x);

            System.out.println("内部类的sid:"+sid);
            System.out.println("外部类的sid:"+Outer.sid);
        }
    }

    //局部内部类出现在方法体中.
    public void createLocalClass(){
        class LocalClass implements Printable{
            public int id = 200;

            //public static int sid = 500;

            @Override
            public void tests(int age) {
                System.out.println("age:"+age);

                System.out.println("内部类id:"+id);
                System.out.println("外部类id:"+Outer.this.id);

                System.out.println("外部类的sid:"+sid);
            }
        }
        //局部类的使用使用范围只能在这个方法内部.

        //创建局部内部类的对象
        LocalClass local = new LocalClass();

        local.tests(23);
    }

    //匿名内部类 - 懒 - 不想取名字,不想建太多的实现类.
    //必须要掌握..
    public void testNoNameClass(){

        new Printable() {
            @Override
            public void tests(int age) {
                System.out.println("age:"+age);
            }
        }.tests(23);
    }
}
